package reflection;

import java.lang.reflect.Constructor;

/**
 * 通过反射创建对象
 */
public class ReflectCreateInstance {

    public static void main(String[] args) throws Exception {
        /*
            方式一：调用类中public修饰的无参构造器
            方式二：调用类中的指定构造器

            Class类相关方法
            newInstance
            getConstructor(Class..clazz)
            getDeclaredConstructor(Class...clazz)

            Constructor类相关方法
            setAccessible
            new Instance(Object...obj)
         */
        //1. 先获取到User类的Class对象
        Class<?> userClass = Class.forName("reflection.User");

        //2. 通过public 的无参构造器创建实例
        Object o = userClass.newInstance();
        System.out.println(o);

        //3. 通过public 的有参构造器创建实例
        /*constructor 对象就是
            public User(String name) {//public 的有参构造器
                this.name = name;
            }
         */

        //3.1 先得到对应构造器
        Constructor<?> constructor = userClass.getConstructor(String.class);
        //3.2 创建实例，并传入实参
        Object lmy = constructor.newInstance("lmy");
        System.out.println("lmy=" + lmy);

        //4. 通过非public 的有参构造器创建实例
        //4.1 得到 private 的构造器对象
        Constructor<?> constructor1 = userClass.getDeclaredConstructor(int.class, String.class);
        //4.2 创建实例
        //暴破【暴力破解】 , 使用反射可以访问private构造器/方法/属性, 反射面前，都是纸老虎
        constructor1.setAccessible(true);
        Object user2 = constructor1.newInstance(100, "张三丰");
        System.out.println("user2=" + user2);

    }
}
